#pragma once
#include <iostream>

#include "RBTreemod.h"
#include "map.h"
#include "set.h"

void test1()
{
	MyRBTree::Map<int, int> rb1;

	for (int i = 30;i < 40;i++)
	{
		rb1.insert({ i,i });
	}
	for (int i = 0;i < 10;i++)
	{
		rb1.insert({ i,i });
	}
	for (int i = 50;i < 60;i++)
	{
		rb1.insert({ i,i });
	}
	for (int i = 20;i < 30;i++)
	{
		rb1.insert({ i,i });
	}
	for (int i = 40;i < 50;i++)
	{
		rb1.insert({ i,i });
	}
	for (int i = 10;i < 20;i++)
	{
		rb1.insert({ i,i });
	}
	rb1.InOrder();
	std::cout << rb1.BlackNum() << ' ' << rb1.IsRBTree() << std::endl;
	MyRBTree::Map<int,int>::iterator it1 = rb1.end();

	for (auto it : rb1)
	{
		std::cout << it.first << ' ';
	}
	std::cout << std::endl;

	while (it1 != rb1.begin())
	{
		it1--;
		std::cout << it1.operator*().first << ' ';
	}
	std::cout << std::endl;

	std::pair<typename MyRBTree::Map<int, int>::iterator, bool> make_pair = rb1.insert({ 20,50 });
	std::cout << make_pair.first->first << ' ' << make_pair.first->second << std::endl;

	rb1[20] = 50;
	std::cout << make_pair.first->first << ' ' << make_pair.first->second << std::endl;


}

void test2()
{
	MyRBTree::Set<int> rb1;

	for (int i = 30;i < 40;i++)
	{
		rb1.insert({ i });
	}
	for (int i = 0;i < 10;i++)
	{
		rb1.insert({ i });
	}
	for (int i = 50;i < 60;i++)
	{
		rb1.insert({ i });
	}
	for (int i = 20;i < 30;i++)
	{
		rb1.insert({ i });
	}
	for (int i = 40;i < 50;i++)
	{
		rb1.insert({ i });
	}
	for (int i = 10;i < 20;i++)
	{
		rb1.insert({ i });
	}
	rb1.InOrder();
	std::cout << rb1.BlackNum() << ' ' << rb1.IsRBTree() << std::endl;
}

void test3()
{
	MyRBTree::Set<int> rb1;
	rb1.insert({ 10 });
	rb1.insert({ 11 });
	rb1.insert({ 12 });
	rb1.insert({ 13 });
	rb1.insert({ 14 });
	rb1.insert({ 0 });
	rb1.insert({ 1 });
	rb1.insert({ 2 });
	rb1.insert({ 3 });
	rb1.insert({ 4 });
	rb1.insert({ 25 });
	rb1.insert({ 26 });
	rb1.insert({ 27 });
	rb1.insert({ 28 });
	rb1.insert({ 29 });
	rb1.insert({ 5 });
	rb1.insert({ 6 });
	rb1.insert({ 7 });
	rb1.insert({ 8 });
	rb1.insert({ 9 });
	rb1.insert({ 15 });
	rb1.insert({ 16 });
	rb1.insert({ 17 });
	rb1.insert({ 18 });
	rb1.insert({ 19 });
	rb1.insert({ 15 });
	rb1.insert({ 20 });
	rb1.insert({ 21 });
	rb1.insert({ 22 });
	rb1.insert({ 23 });
	rb1.insert({ 24 });
	rb1.insert({ 25 });
	rb1.LevelOrderPrint();

	MyRBTree::Set<int>::iterator it1 = rb1.end();

	for (auto it : rb1)
	{
		std::cout << it << ' ';
	}
	std::cout << std::endl;

	while (it1 != rb1.begin())
	{
		it1--;
		std::cout << it1.operator*() << ' ';
	}
}


void test4()
{
	MyRBTree::Map<int, int> rb1;

	int j = 0;
	for (int i = 30;i < 40;i++)
	{
		rb1.insert({ i,j++ });
	}
	for (int i = 30;i < 40;i++)
	{
		rb1.insert({ i,j++ });
	}for (int i = 30;i < 40;i++)
	{
		rb1.insert({ i,j++ });
	}
	rb1.InOrder();
	std::cout << rb1.BlackNum() << ' ' << rb1.IsRBTree() << std::endl;
}


int main()
{
	test1();
	//test2();
	//test3();
	//test4();

	return 0;
}